/******************************************************************************* * Copyright (c) 2004, 2010 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.ant.internal.ui.editor.templates; import org.eclipse.ant.internal.ui.model.IAntModel; import org.eclipse.jface.text.BadLocationException; import org.eclipse.jface.text.Document; import org.eclipse.jface.text.IDocument; import org.eclipse.jface.text.IRegion; import org.eclipse.jface.text.Position; import org.eclipse.jface.text.TextUtilities; import org.eclipse.jface.text.templates.DocumentTemplateContext; import org.eclipse.jface.text.templates.Template; import org.eclipse.jface.text.templates.TemplateBuffer; import org.eclipse.jface.text.templates.TemplateContextType; import org.eclipse.jface.text.templates.TemplateException; import org.eclipse.jface.text.templates.TemplateTranslator; public class AntContext extends DocumentTemplateContext { private IAntModel fAntModel; public AntContext(TemplateContextType type, IDocument document, IAntModel model, Position position) { super(type, document, position); fAntModel = model; } /* * (non-Javadoc) * * @see org.eclipse.jface.text.templates.TemplateContext#evaluate(org.eclipse.jface.text.templates.Template) */ @Override public TemplateBuffer evaluate(Template template) throws BadLocationException, TemplateException { if (!canEvaluate(template)) return null; TemplateBuffer templateBuffer = createTemplateBuffer(template); if (templateBuffer == null) { return null; } // TODO Not enabled see bug 55356 // if (false && AntUIPlugin.getDefault().getPreferenceStore().getBoolean(AntEditorPreferenceConstants.TEMPLATES_USE_CODEFORMATTER)) { // FormattingPreferences prefs = new FormattingPreferences(); // XmlFormatter.format(templateBuffer, this, prefs); // } return templateBuffer; } private TemplateBuffer createTemplateBuffer(Template template) throws BadLocationException, TemplateException { String lineDelimiter = TextUtilities.getDefaultLineDelimiter(getDocument()); IDocument document = new Document(template.getPattern()); convertLineDelimiters(document, lineDelimiter); TemplateTranslator translator = new TemplateTranslator(); TemplateBuffer buffer = translator.translate(document.get()); getContextType().resolve(buffer, this); return buffer; } private static void convertLineDelimiters(IDocument document, String defaultLineDelimiter) throws BadLocationException { int lines = document.getNumberOfLines(); for (int line = 0; line < lines; line++) { IRegion region = document.getLineInformation(line); String lineDelimiter = document.getLineDelimiter(line); if (lineDelimiter != null) document.replace(region.getOffset() + region.getLength(), lineDelimiter.length(), defaultLineDelimiter); } } /** * @return Returns the AntModel. */ public IAntModel getAntModel() { return fAntModel; } /* * (non-Javadoc) * * @see org.eclipse.jface.text.templates.DocumentTemplateContext#getEnd() */ @Override public int getEnd() { int start = getCompletionOffset(); int length = getCompletionLength(); IDocument document = getDocument(); if (start > 0 && document.get().charAt(start - 1) == '<' && document.getLength() > 1) { length++; } int end = getCompletionOffset() + length; try { while (start != end && Character.isWhitespace(document.getChar(end - 1))) end--; } catch (BadLocationException e) { // Return latest valid end } return end; } /* * (non-Javadoc) * * @see org.eclipse.jface.text.templates.DocumentTemplateContext#getStart() */ @Override public int getStart() { int replacementOffset = getCompletionOffset(); if (replacementOffset > 0 && getDocument().get().charAt(replacementOffset - 1) == '<') { replacementOffset--; } return replacementOffset; } }